from PySide2 import QtWidgets
from PySide2.QtUiTools import QUiLoader
import sys
import time
import ExceInit
import os
import ToolFun
import config
import SetTestParameter


# 电压测试主界面
class MainWindowVoltage:

        def __init__(self):
            self.InitDevice = config.get_init_device_value() # 初始化测试类型
            self.fine_add = config.get_fine_add_value() # 获取文件储存起始地址
            self.res = config.get_device_res_value() #获取文件标识符
            # 动态加载UI文件
            self.ui = QUiLoader().load("./UI/TestVoltageUI.ui") #主界面文件
            self.ui.setWindowTitle("【古鑫】安捷伦34465 电压测试软件 V1.0")
            self.set_parameter_window = None
            self.help_tool_window = None
            self.about_tool_window = None

            # 【查询历史数据】点击槽函数
            self.ui.OpenFineTool.triggered.connect(self.open_fine_fool)
            # 【退出】点击槽函数
            self.ui.ExitTool.triggered.connect(self.exit_tool)
            # 【帮助信息】点击槽函数
            self.ui.HelpTool.triggered.connect(self.help_tool)
            # 【关于】点击槽函数
            self.ui.AboutTool.triggered.connect(self.about_tool)

            # 联机初始化测试
            self.test_link()
            # 【联机测试】点击槽函数
            self.ui.LinkTest.clicked.connect(self.test_link)
            # 【设置测试参数】点击槽函数
            self.ui.SetTestParameterButt.clicked.connect(self.set_parameter_ui)
            # 【SN输入框回车】槽函数
            self.ui.lineEdit.returnPressed.connect(self.text_enter)
            # 【开始测试】槽函数
            self.ui.StartTest.clicked.connect(self.text_enter)

        # 【查询历史数据】
        def open_fine_fool(self):
            os.startfile(self.fine_add)

        # 【退出】
        def exit_tool(self):
            app = config.get_app_value()
            sys.exit(app.exec_())

        # 【帮助信息】
        def help_tool(self):
            self.help_tool_window = ToolFun.HelpTool()
            self.help_tool_window.HelpTool.show()

        # 【关于】
        def about_tool(self):
            self.about_tool_window = ToolFun.AboutTool()
            self.about_tool_window.AboutTool.show()

        # 【联机测试】
        def test_link(self):
            ToolFun.test_link(self.ui)

        # 点击设置参数按钮后
        def set_parameter_ui(self):
            self.set_parameter_window = SetTestParameter.SetTestParameterVoltage()
            self.set_parameter_window.SetTestParameter.show()

        # SN文本回车后 & 点击开始测试槽函数
        def text_enter(self):
            self.table_data_write()  #启动测试
            self.ui.lineEdit.clear() #清除原本文本框的SN号

        # 启动测试&保存数据函数
        def table_data_write(self):
            # 获取基础内容&和SN号
            test_parameter = config.get_test_parameter_value() #获取初始化测试内容
            number = config.get_number_value()   #获取初始的序列号
            self.res = config.get_device_res_value() #获取文件标识符
            excel_name = config.get_excel_name_value() #获取Excel名字

            sn = ExceInit.SnData(excel_name)
            text = self.ui.lineEdit.text()  # 读取SN内容
            sys_time = (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) #获取当前时间

            # 判断长度是否合格，合格后启动测试
            if len(text) == int(test_parameter['SNLenSpinBox']):    #判断SN长度
                test_crr_data = self.res.query("MEAS:VOLTAGE:DC?")  # 开启设备测试

                # 符合电压标准的
                if (float(test_parameter['MinData'])*1) < (float(test_crr_data)) < (float(test_parameter['MaxData'])*1):

                    # 输出序列号,UI界面和excel都增加列号
                    ExceInit.ui_excel_write(self.ui, str(text))
                    # 输出电压,UI界面和excel都增加列号
                    ExceInit.ui_excel_write(self.ui, '%.5f' %(float(test_crr_data)*1))
                    # 输出OK值,UI界面和excel都增加列号
                    ExceInit.ui_excel_write(self.ui, 'PASS')
                    # 输出测试时间,UI界面和excel都增加列号
                    ExceInit.ui_excel_write(self.ui, sys_time)


                    # 软件界面满数据下滚
                    number = int(number) + 1
                    config.change_number_value(number)
                    if number >= 12:# 如果UI已经占满了12行，则插入新行&页面下滚
                        self.ui.TestData.insertRow(number)
                        self.ui.TestData.scrollToBottom()

                    # 记录测试过的SN号，EXCEL的行号，以字典的形式储存到列表中
                    config.sn_list_append_value( sn.save_sn(text,config.get_excel_row_value()) )
                    # 传入SN列表字典，如果SN号已经存在的，删除EXCEL对应行。
                    sn_list = config.get_sn_list_value()  # 获取SN储存列表
                    sn.sn_judeg(text, sn_list)
                    # UI和EXCEL坐标重新置位
                    config.reset_ui_excel_coordinate()
                    # 更新ng统计到UI
                    config.change_ok_result_statistics_value(self.ui)

                # 不符合电压测试标准的
                else:
                    # 保存NG数据的
                    if str(test_parameter['SaveNGcheck']) == 'PySide2.QtCore.Qt.CheckState.Checked':

                        # 输出序列号,UI界面和excel都增加列号
                        ExceInit.ui_excel_write(self.ui, str(text))
                        # 输出电压,UI界面和excel都增加列号
                        ExceInit.ui_excel_write(self.ui, '%.5f'%(float(test_crr_data)*1))
                        # 输出NG值,UI界面和excel都增加列号
                        ExceInit.ui_excel_write(self.ui, 'NG')
                        # 输出测试时间,UI界面和excel都增加列号
                        ExceInit.ui_excel_write(self.ui, sys_time)
                        # 更新ng统计到UI
                        config.change_ng_result_statistics_value(self.ui)

                        # 软件界面满数据下滚
                        number = int(number) + 1
                        config.change_number_value(number)
                        if number >= 12:
                            self.ui.TestData.insertRow(number)
                            self.ui.TestData.scrollToBottom()

                        # 测试NG设备发出报警声音 & 软件弹出提示框
                        ToolFun.ng_warning(self.res,self.ui,"测试异常","#测试NG#")
                        # UI和EXCEL坐标重新置位
                        config.reset_ui_excel_coordinate()
                        # 更新ng统计到UI
                        config.change_ok_result_statistics_value(self.ui)

                    # 不保存NG数据
                    elif str(test_parameter['SaveNGcheck']) == 'PySide2.QtCore.Qt.CheckState.Unchecked':

                        # 输出序列号,UI界面和excel都增加列号
                        ExceInit.ui_write(self.ui, str(text))
                        # 输出电压,UI界面和excel都增加列号
                        ExceInit.ui_write(self.ui, '%.5f'%(float(test_crr_data)*1))
                        # 输出NG值,UI界面和excel都增加列号
                        ExceInit.ui_write(self.ui, 'NG')
                        # 输出测试时间,UI界面和excel都增加列号
                        ExceInit.ui_write(self.ui, sys_time)
                        # 更新ng统计到UI
                        config.change_ng_result_statistics_value(self.ui)

                        # 软件界面满数据下滚
                        number = int(number) + 1
                        config.change_number_value(number)
                        if number >= 12:
                            self.ui.TestData.insertRow(number)
                            self.ui.TestData.scrollToBottom()

                        # UI坐标重新置位
                        config.reset_ui_coordinate()
                        # 测试NG设备发出报警声音 & 软件弹出提示框
                        ToolFun.ng_warning(self.res,self.ui,"测试异常","#测试NG#")

            # 长度不合格，弹出提示框
            else:
                QtWidgets.QMessageBox.critical(self.ui, "SN异常", "# 扫描的SN长度与设置的不一致 #\
                                                                 \n  # 或者未进行设置测试参数 #")
